home *** CD-ROM | disk | FTP | other *** search
/ BCI NET 2 / BCI NET 2.iso / archives / programming / e / amigae30a_fr.lha / AmigaE30f / Sources / Pd / Talk.e < prev   
Encoding:
Text File  |  1994-02-21  |  5.8 KB  |  153 lines

  1. /* Talk V1.0 - par Rob Verver in 1992                                      */
  2. /* Traduction : Olivier ANH (BUGSS)                                        */
  3. /*                                                                         */
  4. /* Avec ces commandes shell, vous pourrez faire dire n'importe quel texte  */
  5. /* avec le nouveau narrator.device de l'OS 2.0. Si une valeur donnée est   */
  6. /* hors norme, la valeur correcte sera affichée. Voyez le manuel de l'Amiga*/
  7. /* pour plus de renseignements.                                            */
  8. /*                                                                         */
  9. /* Améliorations possible :                                                */
  10. /*   Capacité de dire des chaines phonétiques                              */
  11. /*   Entrée par l'entrée standard (STDIN) pour les pipes                   */
  12. /*   Fichier de préférences en ASCII, contrôlant tous les paramètres       */
  13. /*   Les codes d'échappement modifie en partie le texte                    */
  14.  
  15. OPT OSVERSION=37
  16.  
  17. MODULE 'Translator', 'devices/narrator', 'dos/dos', 'exec/memory', 'exec/io'
  18.  
  19. CONST AUDIOCHANSIZE=4
  20. ENUM NONE, ERR_DOS, ERR_MEM, ERR_FILE, ERR_DEVICE, ERR_TRANS, ERR_INVALID
  21.  
  22. OBJECT arglist
  23.   file, rate, pitch, robotic, female, volume, enthusiasm, perturb, f1adj,
  24.   f2adj, f3adj, a1adj, a2adj, a3adj, articulate, centralize, centphon, avbias,
  25.   afbias, priority
  26. ENDOBJECT
  27.  
  28. DEF template, args: arglist, phonebuf=NIL, rdargs=NIL, file=NIL, msgport=NIL,
  29.     filebuf=NIL, ioreq: PTR TO ndi, audiochan: PTR TO CHAR, valid=TRUE,
  30.     length, phonebufsize
  31.  
  32. PROC main () HANDLE
  33.   audiochan := [3, 5, 10, 12]:CHAR
  34.  
  35.   /* analyse les options de la ligne de commande */
  36.   args := [NIL, [DEFRATE], [DEFPITCH], 0, 0, [DEFVOL], [DEFF0ENTHUS],
  37.           [DEFF0PERT], [0], [0], [0], [0], [0], [0], [DEFARTIC],
  38.           [DEFCENTRAL], NIL, [0], [0], [25]]: arglist
  39.   template := 'FILE,RATE/K/N,PITCH/K/N,ROBOTIC/S,FEMALE/S,VOLUME/K/N,' +
  40.               'ENTHUSIASM/K/N,PERTURB/K/N,F1ADJ/K/N,F2ADJ/K/N,F3ADJ/K/N,' +
  41.               'A1ADJ/K/N,A2ADJ/K/N,A3ADJ/K/N,ARTICULATE/K/N,CENTRALIZE/K/N,' +
  42.               'CENTPHON/K,AVBIAS/K/N,AFBIAS/K/N,PRIORITY/K/N'
  43.   rdargs := ReadArgs (template, args, NIL)
  44.   IF rdargs=NIL THEN Raise (ERR_DOS)
  45.  
  46.   /* ouvre la bibliothèque translator.library */
  47.   translatorbase := OpenLibrary ('translator.library', 37)
  48.   IF translatorbase=NIL THEN Raise (ERR_TRANS)
  49.  
  50.   /* ouvre le fichier d'enntrée */
  51.   file := Open (args.file, MODE_OLDFILE)
  52.   IF file=NIL THEN Raise (ERR_FILE)
  53.   length := FileLength (args.file)           /* !!! ascii, pas fh */
  54.   IF length<1 THEN Raise (ERR_FILE)
  55.  
  56.   /* alloue le buffer d'entrée */
  57.   filebuf := AllocVec (length, MEMF_PUBLIC)
  58.   IF filebuf=NIL THEN Raise (ERR_MEM)
  59.  
  60.   /* alloue le buffer pour les chaines de caractères phonétiques */
  61.   phonebufsize := Shl (length, 1)
  62.   phonebuf := AllocVec (phonebufsize, MEMF_PUBLIC)
  63.   IF phonebuf=NIL THEN Raise (ERR_MEM)
  64.  
  65.   /* ouvre le narrator.device */
  66.   msgport := CreateMsgPort ()
  67.   IF msgport=NIL THEN Raise (ERR_DEVICE)
  68.   ioreq := CreateIORequest (msgport, SIZEOF ndi)
  69.   IF ioreq=NIL THEN Raise (ERR_DEVICE)
  70.   ioreq.flags := NDF_NEWIORB
  71.   IF OpenDevice ('narrator.device', 0, ioreq, NIL)<>NIL THEN Raise (ERR_DEVICE)
  72.  
  73.   /* vérifie la validité des valeurs */
  74.   checkVal (Long (args.rate), MINRATE, MAXRATE, 'Mauvais rate')
  75.   checkVal (Long (args.pitch), MINPITCH, MAXPITCH, 'Mauvais pitch')
  76.   checkVal (Long (args.volume), MINVOL, MAXVOL, 'Mauvais volume')
  77.   checkVal (Long (args.centralize), MINCENT, MAXCENT, 'Mauvaise centralisation')
  78.   IF valid=FALSE THEN Raise (ERR_INVALID)
  79.  
  80.   ioreq.chmasks := audiochan
  81.   ioreq.nummasks := AUDIOCHANSIZE
  82.  
  83.   /* init values */
  84.   ioreq.rate := Long (args.rate)
  85.   ioreq.pitch := Long (args.pitch)
  86.   ioreq.volume := Long (args.volume)
  87.   ioreq.f0enthusiasm := Long (args.enthusiasm)
  88.   ioreq.f0perturb := Long (args.perturb)
  89.   ioreq.f1adj := Long (args.f1adj)
  90.   ioreq.f2adj := Long (args.f2adj)
  91.   ioreq.f3adj := Long (args.f3adj)
  92.   ioreq.a1adj := Long (args.a1adj)
  93.   ioreq.a2adj := Long (args.a2adj)
  94.   ioreq.a3adj := Long (args.a3adj)
  95.   ioreq.articulate := Long (args.articulate)
  96.   ioreq.centralize := Long (args.centralize)
  97.   ioreq.centphon := Long (args.centphon)
  98.   ioreq.avbias := Long (args.avbias)
  99.   ioreq.afbias := Long (args.afbias)
  100.   ioreq.priority := Long (args.priority)
  101.   IF args.robotic<>NIL THEN ioreq.mode := ROBOTICF0 ELSE ioreq.mode := MANUALF0
  102.   IF args.female<>NIL THEN ioreq.sex := FEMALE
  103.  
  104.   process ()
  105.  
  106.   Raise (0)
  107. EXCEPT
  108.   SELECT exception
  109.     CASE ERR_DOS;     PrintFault (IoErr(), 'Erreur')
  110.     CASE ERR_MEM;     PutStr ('Erreur: Pas assez de mémoire\n')
  111.     CASE ERR_FILE;    PutStr ('Erreur: Ne peut ouvrir le fichier\n')
  112.     CASE ERR_DEVICE;  PutStr ('Erreur: Ne peut ouvrir le narrator.device\n')
  113.     CASE ERR_TRANS;   PutStr ('Erreur: Ne peut ouvrir la translator.library V37\n')
  114.     CASE ERR_INVALID; PutStr ('Erreur: Mauvais paramètres\n')
  115.   ENDSELECT
  116.  
  117.   IF ioreq<>NIL THEN CloseDevice (ioreq) BUT DeleteIORequest (ioreq)
  118.   IF translatorbase<>NIL THEN CloseLibrary (translatorbase)
  119.   IF rdargs<>NIL THEN FreeArgs (rdargs)
  120.   IF phonebuf<>NIL THEN FreeVec (phonebuf)
  121.   IF filebuf<>NIL THEN FreeVec (filebuf)
  122.   IF file<>NIL THEN Close (file)
  123.   IF msgport<>NIL THEN DeleteMsgPort (msgport)
  124.   IF exception THEN CleanUp (10)
  125. ENDPROC
  126.  
  127. PROC checkVal (val, min, max, str)
  128.   IF val<min OR (val>max)
  129.     Vprintf ('%s: de bonnes valeurs sont entre %ld et %ld\n', [str, min, max])
  130.     valid := FALSE
  131.   ENDIF
  132. ENDPROC
  133.  
  134. PROC process ()
  135.   DEF readlen          /* !!!! était égal à globvar */
  136.  
  137.   readlen := Read (file, filebuf, length)
  138.   IF readlen<>length THEN Raise (ERR_FILE)
  139.  
  140.   Translate (filebuf, length, phonebuf, phonebufsize)
  141.   /* WriteF ('Chaines phonétique :\s\n', phonebuf) */
  142.   speakBuffer (phonebuf, StrLen (phonebuf))
  143. ENDPROC
  144.  
  145. PROC speakBuffer (buffer, length)
  146.   DEF ior:PTR TO iostd
  147.   ior := ioreq
  148.   ior.command := CMD_WRITE
  149.   ior.data := buffer
  150.   ior.length := length
  151.   DoIO (ioreq)
  152. ENDPROC
  153.